home *** CD-ROM | disk | FTP | other *** search
/ World Tours: Brazil / WorldTours: Brazil.iso / mac / content / main.dir / 00120_Script_TextScrollBar v1.05 < prev   
Text File  |  2007-04-22  |  14KB  |  431 lines

  1. --------------------------------------------------------------------------------------------------------------
  2. -- Custom ScrollBar  v1.05
  3.  
  4. -- DESCRIPTION
  5. -- Apply this behaviour to a placeholder shape streched into the right height for the scrollbar.
  6. -- This behaviour will create a temporay bitmap (using the bitmap references described below) if necessary.
  7. -- The drag-handle resizes (and indicates how much text there is to scroll)
  8.  
  9. -- Specify the #text or #field member this widget controls. Note that the scrolling member is 
  10. -- expected to be a sprite on stage during the life of this behaviour's instance
  11.  
  12.  
  13. -- UPDATES/CHANGES
  14.  
  15. -- 9/9/02: 
  16.  
  17. --> Added some optimsation so that the image is only updated when the either the text changes or the scroll
  18. --  state has changed (thanks Seb for the suggestion)
  19.  
  20. --> Creating/erasing members can now be handled by script "CastMemberFactory" 
  21.  
  22. --> The scrollbar rect is now determined by the rect of the scrolling target, rather than the dummy sprite.
  23.  
  24. -- 8/9/02: 
  25.  
  26. --> Added flag to GPDL configuration so that the checking for changing text can be switched off. 
  27.  
  28. --------------------------------------------------------------------------------------------------------------
  29. -- DEPENDENCIES
  30. --------------------------------------------------------------------------------------------------------------
  31.  
  32. -- The behaviour expects to find the following bitmap cast members (these should 
  33. -- all be of the same width; "ScrollGuide" and "ScrollHandle_Middle" should be stretchable)
  34.  
  35. --   ï†"ScrollUpArrow"
  36. --   ï†"ScrollUpArrow Pressed"
  37. --   ï†"ScrollDnArrow"
  38. --   ï†"ScrollDnArrow Pressed"
  39. --   ï†"ScrollGuide"
  40. --   ï†"ScrollHandle_BottomEnd"
  41. --   ï†"ScrollHandle_Middle"
  42. --   ï†"ScrollHandle_TopEnd"
  43.  
  44. -- If a new cast member is to be generated, then this behaviour will use script ("CastMemberFactory") - if available
  45.  
  46. --------------------------------------------------------------------------------------------------------------
  47. -- CONFIGURATION
  48. --------------------------------------------------------------------------------------------------------------
  49.  
  50. -- Specify the #text or #field member this widget controls. Note that the scrolling member is 
  51. -- expected to be a sprite on stage during the life of this behaviour's instance
  52.  
  53.  
  54. property myTarget, myTargetSprite, myCheckForTextChangesFlag, myCreateMemberFlag
  55.  
  56.  
  57. --   INTERNAL PROPERTIES
  58.  
  59. property mySprite, myOriginalMember, myMember, myEraseMemberFlag
  60. property myElements, myImage, myCanvas, myOriginalRect
  61. property myUpArrowRect, myDnArrowRect, myGuideRect, myHandleRect
  62. property myMouseTrack, myMouseOffSet, myHandleFlag, myLastScrollPos
  63. property myUpdateFlag, myLastTextCheck, myHandleDrawRect, myHandleOnFlag
  64.  
  65.  
  66.  
  67. --------------------------------------------------------------------------------------------------------------
  68. -- PUBLIC
  69. --------------------------------------------------------------------------------------------------------------
  70.  
  71.  
  72.  
  73. on beginSprite (me)
  74.   me.mInit()
  75. end
  76.  
  77. --on endSprite (me)
  78. --  me.mDestroy()
  79. --end
  80.  
  81. on exitframe (me)
  82.   me.mHandleControls()
  83.   if myUpdateFlag then me.mUpdate()
  84. end
  85.  
  86.  
  87. on mousedown (me)
  88.   
  89.   pointInSideControl = the mouseLoc - mySprite.loc
  90.   
  91.   if inside(pointInSideControl, myHandleRect) then 
  92.     
  93.     -- drag the handle
  94.     myMouseTrack = #Drag
  95.     myMouseOffSet = the mouseV - myHandleRect.top
  96.     
  97.   else if inside(pointInSideControl, myGuideRect) then 
  98.     
  99.     -- jump to point and then drag the handle
  100.     pnt = pointInSideControl.locV - myGuideRect.top
  101.     me.mJumpToPointV(pnt)
  102.     myMouseTrack = #Drag
  103.     myMouseOffSet = the mouseV - myHandleRect.top
  104.     
  105.   else if inside(pointInSideControl, myUpArrowRect) then 
  106.     
  107.     -- scrollUp
  108.     myTarget.scrollByLine(-1)
  109.     myMouseTrack = #ScrollUp
  110.     myImage.copyPixels( myElements[#ScrollUpArrowPress], myUpArrowRect,  myElements[#ScrollUpArrowPress].rect)
  111.     me.mUpdate()
  112.     
  113.     
  114.   else if inside(pointInSideControl, myDnArrowRect) then 
  115.     
  116.     -- scrollDn
  117.     myTarget.scrollByLine(1)
  118.     myMouseTrack = #Scrolldn
  119.     myImage.copyPixels( myElements[#ScrollDnArrowPress], myDnArrowRect,  myElements[#ScrollDnArrowPress].rect)
  120.     me.mUpdate()
  121.     
  122.     
  123.   end if
  124. end 
  125.  
  126. on mouseUp (me)
  127.   myMouseTrack = 0
  128.   me.mRestoreButtons()
  129. end 
  130.  
  131. on mouseUpOutside (me)
  132.   myMouseTrack = 0
  133.   me.mRestoreButtons()
  134. end 
  135.  
  136.  
  137. --------------------------------------------------------------------------------------------------------------
  138. -- AUTHORING
  139. --------------------------------------------------------------------------------------------------------------
  140.  
  141.  
  142.  
  143.  
  144.  
  145. on getpropertyDescriptionList (me)
  146.   pdList = [:]
  147.   pdList[#myTarget] = [:]
  148.   
  149.   
  150.   -- find text/fields
  151.   foundMembers = []
  152.   repeat with chan = 1 to the lastChannel
  153.     -- put sprite(chan).member.type
  154.     if sprite(chan).member.type = #text OR sprite(chan).member.type = #field then foundMembers.add(sprite(chan).member)
  155.   end repeat
  156.   if foundMembers.count = 0 then 
  157.     put "Error finding a text or field sprite"
  158.     exit
  159.   else
  160.     pdList[#myTarget][#Comment] = "Text/Field to scroll (should be a sprite on the stage)"
  161.     pdList[#myTarget][#Format] = #member
  162.     pdList[#myTarget][#Range] = foundMembers
  163.     pdList[#myTarget][#Default] = 0
  164.     
  165.     pdList[#myCheckForTextChangesFlag] = [:]
  166.     pdList[#myCheckForTextChangesFlag][#Comment] = "Check for changing text"
  167.     pdList[#myCheckForTextChangesFlag][#Format] = #boolean
  168.     pdList[#myCheckForTextChangesFlag][#Default] = 1
  169.     
  170.     pdList[#myCreateMemberFlag] = [:]
  171.     pdList[#myCreateMemberFlag][#Comment] = "Create new member?"
  172.     pdList[#myCreateMemberFlag][#Format] = #boolean
  173.     pdList[#myCreateMemberFlag][#Default] = sprite(chan).member.type <> #bitmap
  174.     
  175.     pdList[#myEraseMemberFlag] = [:]
  176.     pdList[#myEraseMemberFlag][#Comment] = "Erase this new member on endSprite?"
  177.     pdList[#myEraseMemberFlag][#Format] = #boolean
  178.     pdList[#myEraseMemberFlag][#Default] = member("CastMemberFactory").type <> #Script
  179.     
  180.     
  181.     return pdList
  182.   end if
  183. end
  184.  
  185. on mInit (me)
  186.   
  187.   mySprite = sprite(me.spriteNum)
  188.   
  189.   if myCreateMemberFlag then 
  190.     if member("CastMemberFactory").type = #Script then 
  191.       idStr = "ScrollBar for " & myTarget.name & me.spriteNum
  192.       myMember = script("CastMemberFactory").mCreate(idStr, #bitmap)
  193.     else
  194.       myMember = new(#bitmap)
  195.       myMember.name = "TEMP"
  196.     end if
  197.   else
  198.     
  199.     myMember  = mySprite.member
  200.     
  201.   end if
  202.   -- find the sprite with the target text/field
  203.   
  204.   repeat with i = 1 to the lastChannel
  205.     if sprite(i).member = myTarget then 
  206.       myTargetSprite = sprite(i)
  207.       exit repeat
  208.     end if
  209.   end repeat
  210.   
  211.   if voidP(myTargetSprite) then 
  212.     put "Error locating sprite contain text/field member " & myMember.name
  213.     sprite(me.spriteNum).scriptInstanceList.deleteOne(me)
  214.   end if
  215.   
  216.   -- get the elements from reference bitmaps
  217.   
  218.   myElements = [:]
  219.   myElements[#ScrollUpArrow] = member("ScrollUpArrow").image.duplicate()
  220.   myElements[#ScrollUpArrowPress] = member("ScrollUpArrow Pressed").image.duplicate()
  221.   myElements[#ScrollDnArrow] = member("ScrollDnArrow").image.duplicate()
  222.   myElements[#ScrollDnArrowPress] = member("ScrollDnArrow Pressed").image.duplicate()
  223.   myElements[#ScrollGuide] = member("ScrollGuide").image.duplicate()
  224.   --  myElements[#ScrollHandle_BottomEnd] = member("ScrollHandle_BottomEnd").image.duplicate()
  225.   myElements[#ScrollHandle_Middle] = member("ScrollHandle_Middle").image.duplicate()
  226.   --  myElements[#ScrollHandle_TopEnd] = member("ScrollHandle_TopEnd").image.duplicate()
  227.   
  228.   
  229.   -- construct the scrollbar
  230.   
  231.   H = myTargetSprite.height
  232.   W = myElements[#ScrollUpArrow].width
  233.   
  234.   
  235.   myOriginalRect = mySprite.rect
  236.   myImage = image(W, H, 24)
  237.   myImage.fill(myImage.rect, rgb(232,232,232))
  238.   
  239.   L = myTargetSprite.right
  240.   T = myTargetSprite.top
  241.   R = L + myImage.width
  242.   B = T + myImage.height
  243.   newRect = rect(L,T,R,B)
  244.   
  245.   
  246.   -- the arrows
  247.   myUpArrowRect = rect(0,0,W, myElements[#ScrollUpArrow].height)
  248.   myImage.copyPixels( myElements[#ScrollUpArrow], myUpArrowRect,  myElements[#ScrollUpArrow].rect )
  249.   
  250.   myDnArrowRect = rect(0,(H-myElements[#ScrollDnArrow].height),W,H)
  251.   myImage.copyPixels( myElements[#ScrollDnArrow], myDnArrowRect,  myElements[#ScrollDnArrow].rect)
  252.   
  253.   -- the guide
  254.   myGuideRect = rect(0,myElements[#ScrollUpArrow].height,W,(H-myElements[#ScrollDnArrow].height))
  255.   myImage.copyPixels( myElements[#ScrollGuide], myGuideRect,  myElements[#ScrollGuide].rect)
  256.   
  257.   
  258.   -- the handle
  259.   myHandleRect = myGuideRect.duplicate() 
  260.   
  261.   myMember.image = myImage
  262.   myMember.regPoint = point(0,0)
  263.   myCanvas = myMember.image
  264.   myOriginalMember = mySprite.member
  265.   myOriginalRect = mySprite.rect
  266.   mySprite.member = myMember
  267.   mySprite.rect = newRect
  268.   myLastTextCheck = ""
  269.   me.mUpdate()
  270. end
  271.  
  272. on mDestroy (me)
  273.   mySprite.member = myOriginalMember
  274.   mySprite.rect = myOriginalRect
  275.   if myCreateMemberFlag then 
  276.     if myEraseMemberFlag then 
  277.       if member("CastMemberFactory").type = #Script then member("CastMemberFactory").mErase(myMember)
  278.       else erase myMember
  279.     end if
  280.   end if
  281. end
  282.  
  283.  
  284.  
  285. --------------------------------------------------------------------------------------------------------------
  286. -- PRIVATE
  287. --------------------------------------------------------------------------------------------------------------
  288.  
  289.  
  290.  
  291.  
  292. on mRestoreButtons (me)
  293.   myImage.copyPixels( myElements[#ScrollUpArrow], myUpArrowRect,  myElements[#ScrollUpArrow].rect)
  294.   myImage.copyPixels( myElements[#ScrollDnArrow], myDnArrowRect,  myElements[#ScrollDnArrow].rect)
  295.   me.mUpdateImage()
  296. end
  297.  
  298.  
  299. on mJumpToPointV (me, aPntV)
  300.   scrollPos = MAX(myGuideRect.top, MIN((myGuideRect.bottom-myHandleRect.Height), aPntV))
  301.   myHandleRect = rect(myGuideRect.left, scrollPos, myGuideRect.right, scrollPos+ myHandleRect.Height)
  302.   if myGuideRect.height <> myHandleRect.Height then 
  303.     portionToScroll = float(scrollPos - myGuideRect.top) / (myGuideRect.height - myHandleRect.Height)
  304.     maxScrolltop = Max (0, myTarget.height - myTargetSprite.height)
  305.     theScrollTop = (portionToScroll * maxScrolltop) 
  306.     myTarget.scrollTop = integer(theScrollTop)
  307.   else
  308.     myTarget.scrollTop = 0
  309.   end if
  310. end
  311.  
  312. --
  313.  
  314.  
  315. on mHandleControls (me)
  316.   case( myMouseTrack ) of
  317.     #Drag: 
  318.       scrollPos = MAX(myGuideRect.top, MIN((myGuideRect.bottom-myHandleRect.Height),  the mouseV - myMouseOffSet))
  319.       if scrollPos = myLastScrollPos then 
  320.         myUpdateFlag = 0
  321.         return
  322.       else
  323.         myLastScrollPos = scrollPos
  324.       end if
  325.       myHandleRect = rect(myGuideRect.left, scrollPos, myGuideRect.right, (scrollPos+ myHandleRect.Height))
  326.       -- update the text member
  327.       if myGuideRect.height <> myHandleRect.Height then 
  328.         portionToScroll = float(scrollPos - myGuideRect.top) / (myGuideRect.height - myHandleRect.Height)
  329.         maxScrolltop = Max(0, myTarget.height -myTargetSprite.height)
  330.         theScrollTop = (portionToScroll * maxScrolltop)
  331.         myTarget.scrollTop = integer(theScrollTop)
  332.       else
  333.         myTarget.scrollTop = 0
  334.       end if
  335.       myUpdateFlag = 1
  336.       
  337.     #ScrollUp:
  338.       myTarget.scrollByLine(-1)
  339.       myUpdateFlag = 1
  340.     #ScrollDn:
  341.       myTarget.scrollByLine(1)
  342.       myUpdateFlag = 1
  343.     otherwise
  344.       -- check if the text has changed
  345.       if myCheckForTextChangesFlag then 
  346.         if myTarget.text <> myLastTextCheck then 
  347.           myLastTextCheck = myTarget.text 
  348.           myUpdateFlag = 1
  349.           return
  350.         end if
  351.       end if
  352.       myUpdateFlag = 0
  353.   end case
  354. end
  355.  
  356. on mUpdate (me)
  357.   
  358.   p = myTargetSprite.height -- pageheight
  359.   h = myTarget.height
  360.   portionVisible = float(p)/h
  361.   
  362.   if portionVisible > 1 then 
  363.     -- text smaller than page
  364.     myHandleRect = myGuideRect.duplicate()
  365.     myHandleHeight = myGuideRect.height
  366.     myHandleFlag = 0
  367.     if myHandleOnFlag then 
  368.       myHandleOnFlag = 0
  369.       myImage.copyPixels( myElements[#ScrollGuide], myGuideRect,  myElements[#ScrollGuide].rect)
  370.     end if
  371.     
  372.   else
  373.     myHandleFlag = 1
  374.     -- Ensure a minimun height for the handle
  375.     myHandleHeight = MAX(20, myGuideRect.height * portionVisible)
  376.     --
  377.     theScrollTop = myTarget.scrollTop
  378.     maxScrolltop = h - p
  379.     if maxScrolltop > 0 then 
  380.       portionScrolled = float(theScrollTop) / maxScrolltop
  381.       handlePos = integer( (myGuideRect.height-myHandleHeight) * portionScrolled )
  382.       T = myGuideRect.top + handlePos
  383.       B = T + myHandleHeight
  384.       R = rect(myGuideRect.left, T, myGuideRect.right, B)
  385.       if R = myHandleRect then myHandleFlag = 0
  386.       else myHandleRect = R
  387.     else
  388.       -- text smaller than page
  389.       myHandleRect = myGuideRect.duplicate()
  390.       myHandleHeight = myGuideRect.height
  391.       myHandleFlag = 0
  392.       if myHandleOnFlag then 
  393.         myHandleOnFlag = 0
  394.         myImage.copyPixels( myElements[#ScrollGuide], myGuideRect,  myElements[#ScrollGuide].rect)
  395.       end if
  396.     end if
  397.   end if
  398.   me.mUpdateImage()
  399.   updateStage
  400. end
  401.  
  402.  
  403. on mUpdateImage (me)
  404.   if myHandleFlag then  -- add the handle (if required)
  405.     handle =  me.mGetHandleImage()
  406.     myImage.copyPixels( myElements[#ScrollGuide], myGuideRect,  myElements[#ScrollGuide].rect)
  407.     myImage.copyPixels( handle, myHandleRect, handle.rect)
  408.     myHandleOnFlag = 1
  409.   end if
  410.   myCanvas.copyPixels( myImage, myImage.rect, myImage.rect)
  411. end
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418. on mGetHandleImage (me)
  419.   handle = image(myHandleRect.width, myHandleRect.height, 24)
  420.  
  421.   destRect = rect(0,0,myElements[#ScrollHandle_Middle].width, myHandleRect.height)
  422.   handle.copyPixels(myElements[#ScrollHandle_Middle], destRect, myElements[#ScrollHandle_Middle].rect)
  423.   
  424.  
  425.   return handle
  426. end
  427.  
  428.  
  429.  
  430.  
  431.